์๊ณ ๋ฆฌ์ฆ ๊ตฌํ์ ์ํ ์๋ฐ์คํฌ๋ฆฝํธ ์๋ฃ ๊ตฌ์กฐ ์ฑ๋ฅ ์ฌ์ธต ๋ถ์. ๊ธ๋ก๋ฒ ๊ฐ๋ฐ์๋ฅผ ์ํ ํต์ฐฐ๊ณผ ์ค์ฉ ์์ ๋ฅผ ์ ๊ณตํฉ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ์๊ณ ๋ฆฌ์ฆ ๊ตฌํ: ์๋ฃ ๊ตฌ์กฐ ์ฑ๋ฅ ๋ถ์
๋น ๋ฅด๊ฒ ๋ณํํ๋ ์ํํธ์จ์ด ๊ฐ๋ฐ์ ์ธ๊ณ์์ ํจ์จ์ฑ์ ๊ฐ์ฅ ์ค์ํฉ๋๋ค. ์ ์ธ๊ณ ๊ฐ๋ฐ์๋ค์๊ฒ ์๋ฃ ๊ตฌ์กฐ์ ์ฑ๋ฅ์ ์ดํดํ๊ณ ๋ถ์ํ๋ ๊ฒ์ ํ์ฅ ๊ฐ๋ฅํ๊ณ , ๋ฐ์์ฑ์ด ๋ฐ์ด๋๋ฉฐ, ๊ฒฌ๊ณ ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค. ์ด ๊ธ์์๋ ์๋ฐ์คํฌ๋ฆฝํธ ๋ด์์์ ์๋ฃ ๊ตฌ์กฐ ์ฑ๋ฅ ๋ถ์์ ํต์ฌ ๊ฐ๋ ์ ๊น์ด ํ๊ณ ๋ค์ด, ๋ชจ๋ ๋ฐฐ๊ฒฝ์ ํ๋ก๊ทธ๋๋จธ๋ค์๊ฒ ๊ธ๋ก๋ฒ ๊ด์ ๊ณผ ์ค์ฉ์ ์ธ ํต์ฐฐ๋ ฅ์ ์ ๊ณตํฉ๋๋ค.
๊ธฐ์ด ๋ค์ง๊ธฐ: ์๊ณ ๋ฆฌ์ฆ ์ฑ๋ฅ ์ดํดํ๊ธฐ
ํน์ ์๋ฃ ๊ตฌ์กฐ์ ๋ํด ์์๋ณด๊ธฐ ์ ์, ์๊ณ ๋ฆฌ์ฆ ์ฑ๋ฅ ๋ถ์์ ๊ธฐ๋ณธ ์์น์ ํ์ ํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์ด๋ฅผ ์ํ ์ฃผ์ ๋๊ตฌ๋ ๋น ์ค(Big O) ํ๊ธฐ๋ฒ์ ๋๋ค. ๋น ์ค ํ๊ธฐ๋ฒ์ ์ ๋ ฅ ํฌ๊ธฐ๊ฐ ๋ฌดํ๋๋ก ์ปค์ง ๋ ์๊ณ ๋ฆฌ์ฆ์ ์๊ฐ ๋๋ ๊ณต๊ฐ ๋ณต์ก๋์ ์ํ์ ์ค๋ช ํฉ๋๋ค. ์ด๋ฅผ ํตํด ์ฐ๋ฆฌ๋ ํ์คํ๋๊ณ ์ธ์ด์ ๊ตฌ์ ๋ฐ์ง ์๋ ๋ฐฉ์์ผ๋ก ๋ค์ํ ์๊ณ ๋ฆฌ์ฆ๊ณผ ์๋ฃ ๊ตฌ์กฐ๋ฅผ ๋น๊ตํ ์ ์์ต๋๋ค.
์๊ฐ ๋ณต์ก๋
์๊ฐ ๋ณต์ก๋๋ ์ ๋ ฅ์ ๊ธธ์ด์ ๋ํ ํจ์๋ก์ ์๊ณ ๋ฆฌ์ฆ์ด ์คํ๋๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ์๋ฏธํฉ๋๋ค. ์ฐ๋ฆฌ๋ ์ข ์ข ์๊ฐ ๋ณต์ก๋๋ฅผ ๋ค์๊ณผ ๊ฐ์ ์ผ๋ฐ์ ์ธ ํด๋์ค๋ก ๋ถ๋ฅํฉ๋๋ค:
- O(1) - ์์ ์๊ฐ: ์คํ ์๊ฐ์ด ์ ๋ ฅ ํฌ๊ธฐ์ ๋ฌด๊ดํฉ๋๋ค. ์: ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐฐ์ด์ ์์์ ์ ๊ทผํ๋ ๊ฒฝ์ฐ.
- O(log n) - ๋ก๊ทธ ์๊ฐ: ์คํ ์๊ฐ์ด ์ ๋ ฅ ํฌ๊ธฐ์ ๋ฐ๋ผ ๋ก๊ทธ์ ์ผ๋ก ์ฆ๊ฐํฉ๋๋ค. ์ด์ง ํ์๊ณผ ๊ฐ์ด ๋ฌธ์ ๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ์ ๋ฐ์ผ๋ก ๋๋๋ ์๊ณ ๋ฆฌ์ฆ์์ ํํ ๋ณผ ์ ์์ต๋๋ค.
- O(n) - ์ ํ ์๊ฐ: ์คํ ์๊ฐ์ด ์ ๋ ฅ ํฌ๊ธฐ์ ๋ฐ๋ผ ์ ํ์ ์ผ๋ก ์ฆ๊ฐํฉ๋๋ค. ์: ๋ฐฐ์ด์ ๋ชจ๋ ์์๋ฅผ ์ํํ๋ ๊ฒฝ์ฐ.
- O(n log n) - ๋ก๊ทธ ์ ํ ์๊ฐ: ๋ณํฉ ์ ๋ ฌ์ด๋ ํต ์ ๋ ฌ๊ณผ ๊ฐ์ ํจ์จ์ ์ธ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์์ ํํ ๋ณผ ์ ์๋ ๋ณต์ก๋์ ๋๋ค.
- O(n^2) - ์ด์ฐจ ์๊ฐ: ์คํ ์๊ฐ์ด ์ ๋ ฅ ํฌ๊ธฐ์ ๋ฐ๋ผ ์ด์ฐจ์ ์ผ๋ก ์ฆ๊ฐํฉ๋๋ค. ๋์ผํ ์ ๋ ฅ์ ์ํํ๋ ์ค์ฒฉ ๋ฃจํ๊ฐ ์๋ ์๊ณ ๋ฆฌ์ฆ์์ ์์ฃผ ๋ํ๋ฉ๋๋ค.
- O(2^n) - ์ง์ ์๊ฐ: ์ ๋ ฅ ํฌ๊ธฐ๊ฐ ํ๋ ์ถ๊ฐ๋ ๋๋ง๋ค ์คํ ์๊ฐ์ด ๋ ๋ฐฐ๋ก ๋์ด๋ฉ๋๋ค. ๋ณต์กํ ๋ฌธ์ ์ ๋ํ ๋ฌด์ฐจ๋ณ ๋์ ๋ฐฉ์(brute-force) ํด๊ฒฐ์ฑ ์์ ์ผ๋ฐ์ ์ผ๋ก ๋ฐ๊ฒฌ๋ฉ๋๋ค.
- O(n!) - ๊ณ์น ์๊ฐ: ์คํ ์๊ฐ์ด ๋งค์ฐ ๋น ๋ฅด๊ฒ ์ฆ๊ฐํ๋ฉฐ, ๋ณดํต ์์ด๊ณผ ๊ด๋ จ์ด ์์ต๋๋ค.
๊ณต๊ฐ ๋ณต์ก๋
๊ณต๊ฐ ๋ณต์ก๋๋ ์ ๋ ฅ ๊ธธ์ด์ ๋ํ ํจ์๋ก์ ์๊ณ ๋ฆฌ์ฆ์ด ์ฌ์ฉํ๋ ๋ฉ๋ชจ๋ฆฌ์ ์์ ์๋ฏธํฉ๋๋ค. ์๊ฐ ๋ณต์ก๋์ ๋ง์ฐฌ๊ฐ์ง๋ก ๋น ์ค ํ๊ธฐ๋ฒ์ ์ฌ์ฉํ์ฌ ํํ๋ฉ๋๋ค. ์ด๋ ๋ณด์กฐ ๊ณต๊ฐ(์๊ณ ๋ฆฌ์ฆ ์์ฒด๊ฐ ์ ๋ ฅ ์ธ์ ์ฌ์ฉํ๋ ๊ณต๊ฐ)๊ณผ ์ ๋ ฅ ๊ณต๊ฐ(์ ๋ ฅ ๋ฐ์ดํฐ๊ฐ ์ฐจ์งํ๋ ๊ณต๊ฐ)์ ํฌํจํฉ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ์ ์ฃผ์ ์๋ฃ ๊ตฌ์กฐ์ ๊ทธ ์ฑ๋ฅ
์๋ฐ์คํฌ๋ฆฝํธ๋ ์ฌ๋ฌ ๋ด์ฅ ์๋ฃ ๊ตฌ์กฐ๋ฅผ ์ ๊ณตํ๋ฉฐ, ๋ ๋ณต์กํ ๊ตฌ์กฐ๋ฅผ ๊ตฌํํ ์๋ ์์ต๋๋ค. ์ผ๋ฐ์ ์ธ ์๋ฃ ๊ตฌ์กฐ๋ค์ ์ฑ๋ฅ ํน์ฑ์ ๋ถ์ํด ๋ณด๊ฒ ์ต๋๋ค:
1. ๋ฐฐ์ด (Arrays)
๋ฐฐ์ด์ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ์๋ฃ ๊ตฌ์กฐ ์ค ํ๋์ ๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ์์ ๋ฐฐ์ด์ ๋์ ์ด๋ฉฐ ํ์์ ๋ฐ๋ผ ํฌ๊ธฐ๊ฐ ๋์ด๋๊ฑฐ๋ ์ค์ด๋ค ์ ์์ต๋๋ค. 0-์ธ๋ฑ์ค ๊ธฐ๋ฐ์ผ๋ก, ์ฒซ ๋ฒ์งธ ์์๋ ์ธ๋ฑ์ค 0์ ์์นํฉ๋๋ค.
์ผ๋ฐ์ ์ธ ์ฐ์ฐ๊ณผ ๋น ์ค:
- ์ธ๋ฑ์ค๋ก ์์ ์ ๊ทผ (์: `arr[i]`): O(1) - ์์ ์๊ฐ. ๋ฐฐ์ด์ ๋ฉ๋ชจ๋ฆฌ์์ ์์๋ฅผ ์ฐ์์ ์ผ๋ก ์ ์ฅํ๋ฏ๋ก ์ง์ ์ ๊ทผ์ด ๊ฐ๋ฅํฉ๋๋ค.
- ๋์ ์์ ์ถ๊ฐ (`push()`): O(1) - ๋ถํ ์ํ(Amortized) ์์ ์๊ฐ. ๊ฐ๋ ํฌ๊ธฐ ์ฌ์กฐ์ ์ ์๊ฐ์ด ๋ ๊ฑธ๋ฆด ์ ์์ง๋ง, ํ๊ท ์ ์ผ๋ก๋ ๋งค์ฐ ๋น ๋ฆ ๋๋ค.
- ๋์์ ์์ ์ ๊ฑฐ (`pop()`): O(1) - ์์ ์๊ฐ.
- ์์ ์์ ์ถ๊ฐ (`unshift()`): O(n) - ์ ํ ์๊ฐ. ๊ณต๊ฐ์ ๋ง๋ค๊ธฐ ์ํด ๋ชจ๋ ํ์ ์์๋ค์ ์ด๋์์ผ์ผ ํฉ๋๋ค.
- ์์์ ์์ ์ ๊ฑฐ (`shift()`): O(n) - ์ ํ ์๊ฐ. ๊ณต๋ฐฑ์ ๋ฉ์ฐ๊ธฐ ์ํด ๋ชจ๋ ํ์ ์์๋ค์ ์ด๋์์ผ์ผ ํฉ๋๋ค.
- ์์ ๊ฒ์ (์: `indexOf()`, `includes()`): O(n) - ์ ํ ์๊ฐ. ์ต์ ์ ๊ฒฝ์ฐ ๋ชจ๋ ์์๋ฅผ ํ์ธํด์ผ ํ ์ ์์ต๋๋ค.
- ์ค๊ฐ์ ์์ ์ฝ์ ๋๋ ์ญ์ (`splice()`): O(n) - ์ ํ ์๊ฐ. ์ฝ์ /์ญ์ ์ง์ ์ดํ์ ์์๋ค์ ์ด๋์์ผ์ผ ํฉ๋๋ค.
๋ฐฐ์ด์ ์ธ์ ์ฌ์ฉํด์ผ ํ๋๊ฐ:
๋ฐฐ์ด์ ์ธ๋ฑ์ค๋ฅผ ํตํ ๋น๋ฒํ ์ ๊ทผ์ด ํ์ํ๊ฑฐ๋, ๋์์ ์์๋ฅผ ์ถ๊ฐ/์ ๊ฑฐํ๋ ๊ฒ์ด ์ฃผ๋ ์์ ์ผ ๋ ์ ๋ ฌ๋ ๋ฐ์ดํฐ ์ปฌ๋ ์ ์ ์ ์ฅํ๋ ๋ฐ ํ์ํฉ๋๋ค. ๊ธ๋ก๋ฒ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฒฝ์ฐ, ํนํ ๋ธ๋ผ์ฐ์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ ์ฝ ์กฐ๊ฑด์ธ ํด๋ผ์ด์ธํธ ์ธก ์๋ฐ์คํฌ๋ฆฝํธ์์ ๋์ฉ๋ ๋ฐฐ์ด์ด ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ ๋ฏธ์น๋ ์ํฅ์ ๊ณ ๋ คํด์ผ ํฉ๋๋ค.
์์:
๊ธ๋ก๋ฒ ์ ์์๊ฑฐ๋ ํ๋ซํผ์ด ์ํ ID๋ฅผ ์ถ์ ํ๋ค๊ณ ์์ํด ๋ด ์๋ค. ์ฃผ๋ก ์ ID๋ฅผ ์ถ๊ฐํ๊ณ ๊ฐ๋ ์ถ๊ฐ๋ ์์๋๋ก ์กฐํํ๋ค๋ฉด ๋ฐฐ์ด์ ์ด๋ฌํ ID๋ฅผ ์ ์ฅํ๊ธฐ์ ์ ํฉํฉ๋๋ค.
const productIds = [];
productIds.push('prod-123'); // O(1)
productIds.push('prod-456'); // O(1)
console.log(productIds[0]); // O(1)
2. ์ฐ๊ฒฐ ๋ฆฌ์คํธ (Linked Lists)
์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ ์์๋ค์ด ์ฐ์์ ์ธ ๋ฉ๋ชจ๋ฆฌ ์์น์ ์ ์ฅ๋์ง ์๋ ์ ํ ์๋ฃ ๊ตฌ์กฐ์ ๋๋ค. ์์(๋ ธ๋)๋ค์ ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํ์ฌ ์ฐ๊ฒฐ๋ฉ๋๋ค. ๊ฐ ๋ ธ๋๋ ๋ฐ์ดํฐ์ ์ํ์ค์์ ๋ค์ ๋ ธ๋๋ฅผ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ๋ฅผ ํฌํจํฉ๋๋ค.
์ฐ๊ฒฐ ๋ฆฌ์คํธ์ ์ข ๋ฅ:
- ๋จ์ผ ์ฐ๊ฒฐ ๋ฆฌ์คํธ: ๊ฐ ๋ ธ๋๊ฐ ๋ค์ ๋ ธ๋๋ง ๊ฐ๋ฆฌํต๋๋ค.
- ์ด์ค ์ฐ๊ฒฐ ๋ฆฌ์คํธ: ๊ฐ ๋ ธ๋๊ฐ ๋ค์ ๋ ธ๋์ ์ด์ ๋ ธ๋๋ฅผ ๋ชจ๋ ๊ฐ๋ฆฌํต๋๋ค.
- ์ํ ์ฐ๊ฒฐ ๋ฆฌ์คํธ: ๋ง์ง๋ง ๋ ธ๋๊ฐ ๋ค์ ์ฒซ ๋ฒ์งธ ๋ ธ๋๋ฅผ ๊ฐ๋ฆฌํต๋๋ค.
์ผ๋ฐ์ ์ธ ์ฐ์ฐ๊ณผ ๋น ์ค (๋จ์ผ ์ฐ๊ฒฐ ๋ฆฌ์คํธ):
- ์ธ๋ฑ์ค๋ก ์์ ์ ๊ทผ: O(n) - ์ ํ ์๊ฐ. ํค๋๋ถํฐ ์ํํด์ผ ํฉ๋๋ค.
- ๋งจ ์์ ์์ ์ถ๊ฐ (ํค๋): O(1) - ์์ ์๊ฐ.
- ๋งจ ๋์ ์์ ์ถ๊ฐ (ํ ์ผ): ํ ์ผ ํฌ์ธํฐ๋ฅผ ์ ์งํ๋ฉด O(1), ๊ทธ๋ ์ง ์์ผ๋ฉด O(n).
- ๋งจ ์์์ ์์ ์ ๊ฑฐ (ํค๋): O(1) - ์์ ์๊ฐ.
- ๋งจ ๋์์ ์์ ์ ๊ฑฐ: O(n) - ์ ํ ์๊ฐ. ๋ง์ง๋ง์์ ๋ ๋ฒ์งธ ๋ ธ๋๋ฅผ ์ฐพ์์ผ ํฉ๋๋ค.
- ์์ ๊ฒ์: O(n) - ์ ํ ์๊ฐ.
- ํน์ ์์น์ ์์ ์ฝ์ ๋๋ ์ญ์ : O(n) - ์ ํ ์๊ฐ. ๋จผ์ ์์น๋ฅผ ์ฐพ์ ๋ค์ ์ฐ์ฐ์ ์ํํด์ผ ํฉ๋๋ค.
์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ ์ธ์ ์ฌ์ฉํด์ผ ํ๋๊ฐ:
์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ ๋งจ ์์ด๋ ์ค๊ฐ์์์ ๋น๋ฒํ ์ฝ์ ๋๋ ์ญ์ ๊ฐ ํ์ํ๊ณ , ์ธ๋ฑ์ค๋ฅผ ํตํ ๋ฌด์์ ์ ๊ทผ์ด ์ฐ์ ์์๊ฐ ์๋ ๋ ๋ฐ์ด๋ ์ฑ๋ฅ์ ๋ณด์ ๋๋ค. ์ด์ค ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ ์๋ฐฉํฅ ์ํ๊ฐ ๊ฐ๋ฅํ์ฌ ์ญ์ ์ ๊ฐ์ ํน์ ์์ ์ ๋จ์ํํ ์ ์์ผ๋ฏ๋ก ์ข ์ข ์ ํธ๋ฉ๋๋ค.
์์:
์์ ํ๋ ์ด์ด์ ์ฌ์ ๋ชฉ๋ก์ ์๊ฐํด ๋ด ์๋ค. ๋ชฉ๋ก ๋งจ ์์ ๋ ธ๋๋ฅผ ์ถ๊ฐํ๊ฑฐ๋(์: ๋ฐ๋ก ๋ค์์ ์ฌ์ํ๊ธฐ ์ํด) ์๋ฌด ๊ณณ์์๋ ๋ ธ๋๋ฅผ ์ ๊ฑฐํ๋ ๊ฒ์ ์ฐ๊ฒฐ ๋ฆฌ์คํธ๊ฐ ๋ฐฐ์ด์ ์ด๋ ์ค๋ฒํค๋๋ณด๋ค ๋ ํจ์จ์ ์ผ ์ ์๋ ์ผ๋ฐ์ ์ธ ์์ ์ ๋๋ค.
class Node {
constructor(data, next = null) {
this.data = data;
this.next = next;
}
}
class LinkedList {
constructor() {
this.head = null;
this.size = 0;
}
// ๋งจ ์์ ์ถ๊ฐ
addFirst(data) {
const newNode = new Node(data, this.head);
this.head = newNode;
this.size++;
}
// ... ๋ค๋ฅธ ๋ฉ์๋๋ค ...
}
const playlist = new LinkedList();
playlist.addFirst('Song C'); // O(1)
playlist.addFirst('Song B'); // O(1)
playlist.addFirst('Song A'); // O(1)
3. ์คํ (Stacks)
์คํ์ LIFO (Last-In, First-Out) ์๋ฃ ๊ตฌ์กฐ์
๋๋ค. ์ ์ ๋๋ฏธ๋ฅผ ์๊ฐํด๋ณด์ธ์: ๋ง์ง๋ง์ ์ถ๊ฐ๋ ์ ์๊ฐ ๊ฐ์ฅ ๋จผ์ ์ ๊ฑฐ๋ฉ๋๋ค. ์ฃผ์ ์ฐ์ฐ์ push(๋งจ ์์ ์ถ๊ฐ)์ pop(๋งจ ์์์ ์ ๊ฑฐ)์
๋๋ค.
์ผ๋ฐ์ ์ธ ์ฐ์ฐ๊ณผ ๋น ์ค:
- Push (๋งจ ์์ ์ถ๊ฐ): O(1) - ์์ ์๊ฐ.
- Pop (๋งจ ์์์ ์ ๊ฑฐ): O(1) - ์์ ์๊ฐ.
- Peek (๋งจ ์ ์์ ํ์ธ): O(1) - ์์ ์๊ฐ.
- isEmpty: O(1) - ์์ ์๊ฐ.
์คํ์ ์ธ์ ์ฌ์ฉํด์ผ ํ๋๊ฐ:
์คํ์ ์ญ์ถ์ (์: ํธ์ง๊ธฐ์์์ ์คํ ์ทจ์/๋ค์ ์คํ ๊ธฐ๋ฅ), ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ํจ์ ํธ์ถ ์คํ ๊ด๋ฆฌ, ๋๋ ํํ์ ํ์ฑ๊ณผ ๊ฐ์ ์์ ์ ์ด์์ ์ ๋๋ค. ๊ธ๋ก๋ฒ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฒฝ์ฐ, ๋ธ๋ผ์ฐ์ ์ ํธ์ถ ์คํ์ ์๋ฌต์ ์ผ๋ก ์๋ํ๋ ์คํ์ ์ข์ ์์ ๋๋ค.
์์:
ํ์ ๋ฌธ์ ํธ์ง๊ธฐ์์ ์คํ ์ทจ์/๋ค์ ์คํ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ ๊ฒฝ์ฐ. ๊ฐ ์์ ์ ์คํ ์ทจ์ ์คํ์ ํธ์๋ฉ๋๋ค. ์ฌ์ฉ์๊ฐ '์คํ ์ทจ์'๋ฅผ ์ํํ๋ฉด ๋ง์ง๋ง ์์ ์ด ์คํ ์ทจ์ ์คํ์์ ํ๋์ด ๋ค์ ์คํ ์คํ์ ํธ์๋ฉ๋๋ค.
const undoStack = [];
undoStack.push('Action 1'); // O(1)
undoStack.push('Action 2'); // O(1)
const lastAction = undoStack.pop(); // O(1)
console.log(lastAction); // 'Action 2'
4. ํ (Queues)
ํ๋ FIFO (First-In, First-Out) ์๋ฃ ๊ตฌ์กฐ์
๋๋ค. ์ค ์ ์๋ ์ฌ๋๋ค๊ณผ ์ ์ฌํ๊ฒ, ๊ฐ์ฅ ๋จผ์ ํฉ๋ฅํ ์ฌ๋์ด ๊ฐ์ฅ ๋จผ์ ์๋น์ค๋ฅผ ๋ฐ์ต๋๋ค. ์ฃผ์ ์ฐ์ฐ์ enqueue(๋ค์ชฝ์ ์ถ๊ฐ)์ dequeue(์์ชฝ์์ ์ ๊ฑฐ)์
๋๋ค.
์ผ๋ฐ์ ์ธ ์ฐ์ฐ๊ณผ ๋น ์ค:
- Enqueue (๋ค์ชฝ์ ์ถ๊ฐ): O(1) - ์์ ์๊ฐ.
- Dequeue (์์ชฝ์์ ์ ๊ฑฐ): O(1) - ์์ ์๊ฐ (์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ ์ํ ๋ฒํผ ๋ฑ์ ์ฌ์ฉํ์ฌ ํจ์จ์ ์ผ๋ก ๊ตฌํ๋ ๊ฒฝ์ฐ). ์๋ฐ์คํฌ๋ฆฝํธ ๋ฐฐ์ด์ `shift()`๋ฅผ ์ฌ์ฉํ๋ฉด O(n)์ด ๋ฉ๋๋ค.
- Peek (์์ชฝ ์์ ํ์ธ): O(1) - ์์ ์๊ฐ.
- isEmpty: O(1) - ์์ ์๊ฐ.
ํ๋ ์ธ์ ์ฌ์ฉํด์ผ ํ๋๊ฐ:
ํ๋ ํ๋ฆฐํฐ ํ, ์๋ฒ์ ์์ฒญ ํ ๋๋ ๊ทธ๋ํ ์ํ์์์ ๋๋น ์ฐ์ ํ์(BFS)๊ณผ ๊ฐ์ด ๋์ฐฉ ์์๋๋ก ์์ ์ ๊ด๋ฆฌํ๋ ๋ฐ ์๋ฒฝํฉ๋๋ค. ๋ถ์ฐ ์์คํ ์์ ํ๋ ๋ฉ์์ง ๋ธ๋ก์ปค๋ง์ ๊ธฐ๋ณธ์ ๋๋ค.
์์:
์ฌ๋ฌ ๋๋ฅ์ ์ฌ์ฉ์๋ก๋ถํฐ ๋ค์ด์ค๋ ์์ฒญ์ ์ฒ๋ฆฌํ๋ ์น ์๋ฒ. ์์ฒญ์ ํ์ ์ถ๊ฐ๋๊ณ ๊ณต์ ์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด ์์ ๋ ์์๋๋ก ์ฒ๋ฆฌ๋ฉ๋๋ค.
const requestQueue = [];
function enqueueRequest(request) {
requestQueue.push(request); // ๋ฐฐ์ด push๋ O(1)
}
function dequeueRequest() {
// JS ๋ฐฐ์ด์์ shift()๋ O(n)์ด๋ฏ๋ก, ๋ง์ถคํ ํ ๊ตฌํ์ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ์ข์ต๋๋ค
return requestQueue.shift();
}
enqueueRequest('Request from User A');
enqueueRequest('Request from User B');
const nextRequest = dequeueRequest(); // array.shift() ์ฌ์ฉ ์ O(n)
console.log(nextRequest); // 'Request from User A'
5. ํด์ ํ ์ด๋ธ (์๋ฐ์คํฌ๋ฆฝํธ์ Objects/Maps)
์๋ฐ์คํฌ๋ฆฝํธ์์ ๊ฐ์ฒด(Objects)์ ๋งต(Maps)์ผ๋ก ์๋ ค์ง ํด์ ํ ์ด๋ธ์ ํด์ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ํค๋ฅผ ๋ฐฐ์ด์ ์ธ๋ฑ์ค์ ๋งคํํฉ๋๋ค. ์ด๋ ํ๊ท ์ ์ผ๋ก ๋งค์ฐ ๋น ๋ฅธ ์กฐํ, ์ฝ์ , ์ญ์ ๋ฅผ ์ ๊ณตํฉ๋๋ค.
์ผ๋ฐ์ ์ธ ์ฐ์ฐ๊ณผ ๋น ์ค:
- ์ฝ์ (ํค-๊ฐ ์): ํ๊ท O(1), ์ต์ O(n) (ํด์ ์ถฉ๋๋ก ์ธํด).
- ์กฐํ (ํค ๊ธฐ์ค): ํ๊ท O(1), ์ต์ O(n).
- ์ญ์ (ํค ๊ธฐ์ค): ํ๊ท O(1), ์ต์ O(n).
์ฐธ๊ณ : ์ต์ ์ ์๋๋ฆฌ์ค๋ ๋ง์ ํค๊ฐ ๋์ผํ ์ธ๋ฑ์ค๋ก ํด์๋ ๋(ํด์ ์ถฉ๋) ๋ฐ์ํฉ๋๋ค. ์ข์ ํด์ ํจ์์ ์ถฉ๋ ํด๊ฒฐ ์ ๋ต(์: ๋ถ๋ฆฌ ์ฐ๊ฒฐ๋ฒ ๋๋ ๊ฐ๋ฐฉ ์ฃผ์๋ฒ)์ ์ด๋ฅผ ์ต์ํํฉ๋๋ค.
ํด์ ํ ์ด๋ธ์ ์ธ์ ์ฌ์ฉํด์ผ ํ๋๊ฐ:
ํด์ ํ ์ด๋ธ์ ๊ณ ์ ์๋ณ์(ํค)๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํญ๋ชฉ์ ์ ์ํ๊ฒ ์ฐพ๊ฑฐ๋, ์ถ๊ฐํ๊ฑฐ๋, ์ ๊ฑฐํด์ผ ํ๋ ์๋๋ฆฌ์ค์ ์ด์์ ์ ๋๋ค. ์ฌ๊ธฐ์๋ ์บ์ ๊ตฌํ, ๋ฐ์ดํฐ ์ธ๋ฑ์ฑ, ๋๋ ํญ๋ชฉ์ ์กด์ฌ ์ฌ๋ถ ํ์ธ์ด ํฌํจ๋ฉ๋๋ค.
์์:
๊ธ๋ก๋ฒ ์ฌ์ฉ์ ์ธ์ฆ ์์คํ . ์ฌ์ฉ์ ์ด๋ฆ(ํค)์ ์ฌ์ฉํ์ฌ ํด์ ํ ์ด๋ธ์์ ์ฌ์ฉ์ ๋ฐ์ดํฐ(๊ฐ)๋ฅผ ์ ์ํ๊ฒ ๊ฒ์ํ ์ ์์ต๋๋ค. `Map` ๊ฐ์ฒด๋ ๋ฌธ์์ด์ด ์๋ ํค๋ฅผ ๋ ์ ์ฒ๋ฆฌํ๊ณ ํ๋กํ ํ์ ์ค์ผ์ ํผํ ์ ์๊ธฐ ๋๋ฌธ์ ์ผ๋ฐ์ ์ผ๋ก ์ด ๋ชฉ์ ์ ์ผ๋ฐ ๊ฐ์ฒด๋ณด๋ค ์ ํธ๋ฉ๋๋ค.
const userCache = new Map();
userCache.set('user123', { name: 'Alice', country: 'USA' }); // ํ๊ท O(1)
userCache.set('user456', { name: 'Bob', country: 'Canada' }); // ํ๊ท O(1)
console.log(userCache.get('user123')); // ํ๊ท O(1)
userCache.delete('user456'); // ํ๊ท O(1)
6. ํธ๋ฆฌ (Trees)
ํธ๋ฆฌ๋ ๊ฐ์ ์ผ๋ก ์ฐ๊ฒฐ๋ ๋ ธ๋๋ก ๊ตฌ์ฑ๋ ๊ณ์ธต์ ์๋ฃ ๊ตฌ์กฐ์ ๋๋ค. ํ์ผ ์์คํ , ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ธ๋ฑ์ฑ, ๊ฒ์ ๋ฑ ๋ค์ํ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋๋ฆฌ ์ฌ์ฉ๋ฉ๋๋ค.
์ด์ง ํ์ ํธ๋ฆฌ (BST):
๊ฐ ๋ ธ๋๊ฐ ์ต๋ ๋ ๊ฐ์ ์์(์ผ์ชฝ, ์ค๋ฅธ์ชฝ)์ ๊ฐ๋ ์ด์ง ํธ๋ฆฌ์ ๋๋ค. ์ฃผ์ด์ง ๋ ธ๋์ ๋ํด, ์ผ์ชฝ ํ์ ํธ๋ฆฌ์ ๋ชจ๋ ๊ฐ์ ๋ ธ๋์ ๊ฐ๋ณด๋ค ์๊ณ , ์ค๋ฅธ์ชฝ ํ์ ํธ๋ฆฌ์ ๋ชจ๋ ๊ฐ์ ๋ ํฝ๋๋ค.
- ์ฝ์ : ํ๊ท O(log n), ์ต์ O(n) (ํธ๋ฆฌ๊ฐ ์ฐ๊ฒฐ ๋ฆฌ์คํธ์ฒ๋ผ ํ์ชฝ์ผ๋ก ์น์ฐ์ณ์ง ๊ฒฝ์ฐ).
- ๊ฒ์: ํ๊ท O(log n), ์ต์ O(n).
- ์ญ์ : ํ๊ท O(log n), ์ต์ O(n).
ํ๊ท ์ ์ผ๋ก O(log n)์ ๋ฌ์ฑํ๋ ค๋ฉด ํธ๋ฆฌ๊ฐ ๊ท ํ์ ์ด๋ฃจ์ด์ผ ํฉ๋๋ค. AVL ํธ๋ฆฌ๋ ๋ ๋-๋ธ๋ ํธ๋ฆฌ์ ๊ฐ์ ๊ธฐ์ ์ ๊ท ํ์ ์ ์งํ์ฌ ๋ก๊ทธ ์ฑ๋ฅ์ ๋ณด์ฅํฉ๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ์๋ ์ด๋ฌํ ๊ธฐ๋ฅ์ด ๋ด์ฅ๋์ด ์์ง ์์ง๋ง ๊ตฌํํ ์ ์์ต๋๋ค.
ํธ๋ฆฌ๋ ์ธ์ ์ฌ์ฉํด์ผ ํ๋๊ฐ:
BST๋ ์ ๋ ฌ๋ ๋ฐ์ดํฐ์ ํจ์จ์ ์ธ ๊ฒ์, ์ฝ์ , ์ญ์ ๊ฐ ํ์ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ํ์ํฉ๋๋ค. ๊ธ๋ก๋ฒ ํ๋ซํผ์ ๊ฒฝ์ฐ, ๋ฐ์ดํฐ ๋ถํฌ๊ฐ ํธ๋ฆฌ ๊ท ํ๊ณผ ์ฑ๋ฅ์ ์ด๋ป๊ฒ ์ํฅ์ ๋ฏธ์น ์ ์๋์ง ๊ณ ๋ คํด์ผ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๋ฐ์ดํฐ๊ฐ ์๊ฒฉํ๊ฒ ์ค๋ฆ์ฐจ์์ผ๋ก ์ฝ์ ๋๋ฉด ์์งํ BST๋ O(n) ์ฑ๋ฅ์ผ๋ก ์ ํ๋ฉ๋๋ค.
์์:
๋น ๋ฅธ ์กฐํ๋ฅผ ์ํด ์ ๋ ฌ๋ ๊ตญ๊ฐ ์ฝ๋ ๋ชฉ๋ก์ ์ ์ฅํ์ฌ, ์๋ก์ด ๊ตญ๊ฐ๊ฐ ์ถ๊ฐ๋์ด๋ ์ฐ์ฐ์ด ํจ์จ์ ์ผ๋ก ์ ์ง๋๋๋ก ๋ณด์ฅํฉ๋๋ค.
// ๋จ์ํ๋ BST ์ฝ์
(๊ท ํ ์กํ์ง ์์)
function insertBST(root, value) {
if (!root) return { value: value, left: null, right: null };
if (value < root.value) {
root.left = insertBST(root.left, value);
} else {
root.right = insertBST(root.right, value);
}
return root;
}
let bstRoot = null;
bstRoot = insertBST(bstRoot, 50); // ํ๊ท O(log n)
bstRoot = insertBST(bstRoot, 30); // ํ๊ท O(log n)
bstRoot = insertBST(bstRoot, 70); // ํ๊ท O(log n)
// ... ๋ฑ๋ฑ ...
7. ๊ทธ๋ํ (Graphs)
๊ทธ๋ํ๋ ๋ ธ๋(์ ์ )์ ์ด๋ค์ ์ฐ๊ฒฐํ๋ ๊ฐ์ ์ผ๋ก ๊ตฌ์ฑ๋ ๋น์ ํ ์๋ฃ ๊ตฌ์กฐ์ ๋๋ค. ์์ ๋คํธ์ํฌ, ๋๋ก ์ง๋, ๋๋ ์ธํฐ๋ท๊ณผ ๊ฐ์ด ๊ฐ์ฒด ๊ฐ์ ๊ด๊ณ๋ฅผ ๋ชจ๋ธ๋งํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
ํํ ๋ฐฉ์:
- ์ธ์ ํ๋ ฌ: `matrix[i][j] = 1`์ด๋ฉด ์ ์ `i`์ `j` ์ฌ์ด์ ๊ฐ์ ์ด ์์์ ๋ํ๋ด๋ 2์ฐจ์ ๋ฐฐ์ด์ ๋๋ค.
- ์ธ์ ๋ฆฌ์คํธ: ๋ฆฌ์คํธ์ ๋ฐฐ์ด๋ก, ๊ฐ ์ธ๋ฑ์ค `i`๋ ์ ์ `i`์ ์ธ์ ํ ์ ์ ๋ค์ ๋ฆฌ์คํธ๋ฅผ ํฌํจํฉ๋๋ค.
์ผ๋ฐ์ ์ธ ์ฐ์ฐ (์ธ์ ๋ฆฌ์คํธ ์ฌ์ฉ ์):
- ์ ์ ์ถ๊ฐ: O(1)
- ๊ฐ์ ์ถ๊ฐ: O(1)
- ๋ ์ ์ ๊ฐ์ ๊ฐ์ ํ์ธ: O(์ ์ ์ ์ฐจ์) - ์ด์์ ์์ ์ ํ์ ์ ๋๋ค.
- ์ํ (์: BFS, DFS): O(V + E), ์ฌ๊ธฐ์ V๋ ์ ์ ์ ์, E๋ ๊ฐ์ ์ ์์ ๋๋ค.
๊ทธ๋ํ๋ ์ธ์ ์ฌ์ฉํด์ผ ํ๋๊ฐ:
๊ทธ๋ํ๋ ๋ณต์กํ ๊ด๊ณ๋ฅผ ๋ชจ๋ธ๋งํ๋ ๋ฐ ํ์์ ์ ๋๋ค. ์๋ก๋ ๋ผ์ฐํ ์๊ณ ๋ฆฌ์ฆ(๊ตฌ๊ธ ์ง๋์ ๊ฐ์), ์ถ์ฒ ์์ง(์: "์ ์๋ ์๋ ์ฌ๋"), ๋คํธ์ํฌ ๋ถ์ ๋ฑ์ด ์์ต๋๋ค.
์์:
์ฌ์ฉ์๊ฐ ์ ์ ์ด๊ณ ์น๊ตฌ ๊ด๊ณ๊ฐ ๊ฐ์ ์ธ ์์ ๋คํธ์ํฌ๋ฅผ ํํํฉ๋๋ค. ๊ณตํต ์น๊ตฌ ์ฐพ๊ธฐ๋ ์ฌ์ฉ์ ๊ฐ์ ์ต๋จ ๊ฒฝ๋ก ์ฐพ๊ธฐ๋ ๊ทธ๋ํ ์๊ณ ๋ฆฌ์ฆ์ ํฌํจํฉ๋๋ค.
const socialGraph = new Map();
function addVertex(vertex) {
if (!socialGraph.has(vertex)) {
socialGraph.set(vertex, []);
}
}
function addEdge(v1, v2) {
addVertex(v1);
addVertex(v2);
socialGraph.get(v1).push(v2);
socialGraph.get(v2).push(v1); // ๋ฌด๋ฐฉํฅ ๊ทธ๋ํ์ ๊ฒฝ์ฐ
}
addEdge('Alice', 'Bob'); // O(1)
addEdge('Alice', 'Charlie'); // O(1)
// ...
์ฌ๋ฐ๋ฅธ ์๋ฃ ๊ตฌ์กฐ ์ ํํ๊ธฐ: ๊ธ๋ก๋ฒ ๊ด์
์๋ฃ ๊ตฌ์กฐ์ ์ ํ์ ์๋ฐ์คํฌ๋ฆฝํธ ์๊ณ ๋ฆฌ์ฆ์ ์ฑ๋ฅ์ ์ง๋ํ ์ํฅ์ ๋ฏธ์นฉ๋๋ค. ํนํ ๋ค์ํ ๋คํธ์ํฌ ์กฐ๊ฑด๊ณผ ๊ธฐ๊ธฐ ์ฑ๋ฅ์ ๊ฐ์ง ์๋ฐฑ๋ง ๋ช ์ ์ฌ์ฉ์์๊ฒ ์๋น์ค๋ฅผ ์ ๊ณตํ ์ ์๋ ๊ธ๋ก๋ฒ ํ๊ฒฝ์์๋ ๋์ฑ ๊ทธ๋ ์ต๋๋ค.
- ํ์ฅ์ฑ: ์ ํํ ์๋ฃ ๊ตฌ์กฐ๊ฐ ์ฌ์ฉ์ ๊ธฐ๋ฐ์ด๋ ๋ฐ์ดํฐ ๋ณผ๋ฅจ์ด ์ฆ๊ฐํจ์ ๋ฐ๋ผ ํจ์จ์ ์ผ๋ก ์ฑ์ฅ์ ์ฒ๋ฆฌํ ์ ์์ต๋๊น? ์๋ฅผ ๋ค์ด, ๊ธ์ํ ๊ธ๋ก๋ฒ ํ์ฅ์ ๊ฒฝํํ๋ ์๋น์ค๋ ํต์ฌ ์์ ์ ๋ํด O(1) ๋๋ O(log n) ๋ณต์ก๋๋ฅผ ๊ฐ์ง ์๋ฃ ๊ตฌ์กฐ๊ฐ ํ์ํฉ๋๋ค.
- ๋ฉ๋ชจ๋ฆฌ ์ ์ฝ: ์์์ด ์ ํ๋ ํ๊ฒฝ(์: ๊ตฌํ ๋ชจ๋ฐ์ผ ๊ธฐ๊ธฐ ๋๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ ํ๋ ๋ธ๋ผ์ฐ์ ๋ด)์์๋ ๊ณต๊ฐ ๋ณต์ก์ฑ์ด ์ค์ํด์ง๋๋ค. ๋๊ท๋ชจ ๊ทธ๋ํ๋ฅผ ์ํ ์ธ์ ํ๋ ฌ๊ณผ ๊ฐ์ ์ผ๋ถ ์๋ฃ ๊ตฌ์กฐ๋ ๊ณผ๋ํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋นํ ์ ์์ต๋๋ค.
- ๋์์ฑ: ๋ถ์ฐ ์์คํ ์์ ์๋ฃ ๊ตฌ์กฐ๋ ์ค๋ ๋๋ก๋ถํฐ ์์ ํ๊ฑฐ๋ ๊ฒฝ์ ์กฐ๊ฑด์ ํผํ๊ธฐ ์ํด ์ ์คํ๊ฒ ๊ด๋ฆฌ๋์ด์ผ ํฉ๋๋ค. ๋ธ๋ผ์ฐ์ ์ ์๋ฐ์คํฌ๋ฆฝํธ๋ ๋จ์ผ ์ค๋ ๋์ด์ง๋ง, Node.js ํ๊ฒฝ๊ณผ ์น ์์ปค๋ ๋์์ฑ ๊ณ ๋ ค ์ฌํญ์ ๋์ ํฉ๋๋ค.
- ์๊ณ ๋ฆฌ์ฆ ์๊ตฌ ์ฌํญ: ํด๊ฒฐํ๋ ค๋ ๋ฌธ์ ์ ์ฑ๊ฒฉ์ด ์ต์ ์ ์๋ฃ ๊ตฌ์กฐ๋ฅผ ๊ฒฐ์ ํฉ๋๋ค. ์๊ณ ๋ฆฌ์ฆ์ด ์์น๋ก ์์์ ์์ฃผ ์ ๊ทผํด์ผ ํ๋ค๋ฉด ๋ฐฐ์ด์ด ์ ํฉํ ์ ์์ต๋๋ค. ์๋ณ์๋ก ๋น ๋ฅธ ์กฐํ๊ฐ ํ์ํ๋ค๋ฉด ํด์ ํ ์ด๋ธ์ด ์ข ์ข ์ฐ์ํฉ๋๋ค.
- ์ฝ๊ธฐ vs. ์ฐ๊ธฐ ์ฐ์ฐ: ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ฝ๊ธฐ ์ค์ฌ์ธ์ง ์ฐ๊ธฐ ์ค์ฌ์ธ์ง ๋ถ์ํ์ญ์์ค. ์ผ๋ถ ์๋ฃ ๊ตฌ์กฐ๋ ์ฝ๊ธฐ์ ์ต์ ํ๋์ด ์๊ณ , ๋ค๋ฅธ ๊ฒ์ ์ฐ๊ธฐ์, ์ผ๋ถ๋ ๊ท ํ์ ์ ๊ณตํฉ๋๋ค.
์ฑ๋ฅ ๋ถ์ ๋๊ตฌ ๋ฐ ๊ธฐ๋ฒ
์ด๋ก ์ ์ธ ๋น ์ค ๋ถ์์ ๋์ด ์ค์ฉ์ ์ธ ์ธก์ ์ด ์ค์ํฉ๋๋ค.
- ๋ธ๋ผ์ฐ์ ๊ฐ๋ฐ์ ๋๊ตฌ: ๋ธ๋ผ์ฐ์ ๊ฐ๋ฐ์ ๋๊ตฌ(Chrome, Firefox ๋ฑ)์ ์ฑ๋ฅ ํญ์ ์ฌ์ฉํ๋ฉด ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ํ๋กํ์ผ๋งํ๊ณ , ๋ณ๋ชฉ ํ์์ ์๋ณํ๋ฉฐ, ์คํ ์๊ฐ์ ์๊ฐํํ ์ ์์ต๋๋ค.
- ๋ฒค์น๋งํน ๋ผ์ด๋ธ๋ฌ๋ฆฌ: `benchmark.js`์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด ํต์ ๋ ์กฐ๊ฑด ํ์์ ๋ค์ํ ์ฝ๋ ์กฐ๊ฐ์ ์ฑ๋ฅ์ ์ธก์ ํ ์ ์์ต๋๋ค.
- ๋ถํ ํ ์คํธ: ์๋ฒ ์ธก ์ ํ๋ฆฌ์ผ์ด์ (Node.js)์ ๊ฒฝ์ฐ ApacheBench(ab), k6 ๋๋ JMeter์ ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋์ ๋ถํ๋ฅผ ์๋ฎฌ๋ ์ด์ ํ๊ณ ์คํธ๋ ์ค ์ํฉ์์ ์๋ฃ ๊ตฌ์กฐ๊ฐ ์ด๋ป๊ฒ ์๋ํ๋์ง ํ ์คํธํ ์ ์์ต๋๋ค.
์์: ๋ฐฐ์ด `shift()` vs. ๋ง์ถคํ ํ ๋ฒค์น๋งํน
์ธ๊ธํ๋ฏ์ด, ์๋ฐ์คํฌ๋ฆฝํธ ๋ฐฐ์ด์ `shift()` ์ฐ์ฐ์ O(n)์ ๋๋ค. ๋ํ(dequeue)์ ํฌ๊ฒ ์์กดํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฒฝ์ฐ ์ด๊ฒ์ ์ฌ๊ฐํ ์ฑ๋ฅ ๋ฌธ์ ๊ฐ ๋ ์ ์์ต๋๋ค. ๊ธฐ๋ณธ์ ์ธ ๋น๊ต๋ฅผ ์์ํด ๋ด ์๋ค:
// ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ ๋ ๊ฐ์ ์คํ์ ์ฌ์ฉํ๋ ๊ฐ๋จํ ๋ง์ถคํ ํ ๊ตฌํ์ ๊ฐ์
// ์ฌ๊ธฐ์๋ ๊ฐ๋
์ ์ค๋ช
ํ๊ธฐ ์ํด ๋จ์ํํฉ๋๋ค.
function benchmarkQueueOperations(size) {
console.log(`ํฌ๊ธฐ ${size}๋ก ๋ฒค์น๋งํน`);
// ๋ฐฐ์ด ๊ตฌํ
const arrayQueue = Array.from({ length: size }, (_, i) => i);
console.time('Array Shift');
while (arrayQueue.length > 0) {
arrayQueue.shift(); // O(n)
}
console.timeEnd('Array Shift');
// ๋ง์ถคํ ํ ๊ตฌํ (๊ฐ๋
์ )
// const customQueue = new EfficientQueue();
// for (let i = 0; i < size; i++) {
// customQueue.enqueue(i);
// }
// console.time('Custom Queue Dequeue');
// while (!customQueue.isEmpty()) {
// customQueue.dequeue(); // O(1)
// }
// console.timeEnd('Custom Queue Dequeue');
}
// benchmarkQueueOperations(10000); // ์๋นํ ์ฐจ์ด๋ฅผ ๊ด์ฐฐํ๊ฒ ๋ ๊ฒ์
๋๋ค
์ด๋ฌํ ์ค์ฉ์ ์ธ ๋ถ์์ ๋ด์ฅ ๋ฉ์๋์ ๊ธฐ๋ณธ ์ฑ๋ฅ์ ์ดํดํ๋ ๊ฒ์ด ์ ์ค์ํ์ง๋ฅผ ๊ฐ์กฐํฉ๋๋ค.
๊ฒฐ๋ก
์๋ฐ์คํฌ๋ฆฝํธ ์๋ฃ ๊ตฌ์กฐ์ ๊ทธ ์ฑ๋ฅ ํน์ฑ์ ์๋ฌํ๋ ๊ฒ์ ๊ณ ํ์ง์ ํจ์จ์ ์ด๊ณ ํ์ฅ ๊ฐ๋ฅํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ค๋ ๋ชจ๋ ๊ฐ๋ฐ์์๊ฒ ํ์์ ์ธ ๊ธฐ์ ์ ๋๋ค. ๋น ์ค ํ๊ธฐ๋ฒ๊ณผ ๋ฐฐ์ด, ์ฐ๊ฒฐ ๋ฆฌ์คํธ, ์คํ, ํ, ํด์ ํ ์ด๋ธ, ํธ๋ฆฌ, ๊ทธ๋ํ์ ๊ฐ์ ๋ค์ํ ๊ตฌ์กฐ์ ์ฅ๋จ์ ์ ์ดํดํจ์ผ๋ก์จ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๊ณต์ ์ง์ ์ ์ธ ์ํฅ์ ๋ฏธ์น๋ ์ ๋ณด์ ์ ๊ฐํ ๊ฒฐ์ ์ ๋ด๋ฆด ์ ์์ต๋๋ค. ์ง์์ ์ธ ํ์ต๊ณผ ์ค์ฉ์ ์ธ ์คํ์ ํตํด ๊ธฐ์ ์ ์ฐ๋งํ๊ณ ๊ธ๋ก๋ฒ ์ํํธ์จ์ด ๊ฐ๋ฐ ์ปค๋ฎค๋ํฐ์ ํจ๊ณผ์ ์ผ๋ก ๊ธฐ์ฌํ์ญ์์ค.
๊ธ๋ก๋ฒ ๊ฐ๋ฐ์๋ฅผ ์ํ ํต์ฌ ์์ฝ:
- ๋น ์ค ํ๊ธฐ๋ฒ ์ดํด๋ฅผ ์ฐ์ ์ํ์ฌ ์ธ์ด์ ๊ตฌ์ ๋ฐ์ง ์๋ ์ฑ๋ฅ ํ๊ฐ๋ฅผ ํ์ญ์์ค.
- ์ฅ๋จ์ ๋ถ์: ๋ชจ๋ ์ํฉ์ ์๋ฒฝํ ๋จ์ผ ์๋ฃ ๊ตฌ์กฐ๋ ์์ต๋๋ค. ์ ๊ทผ ํจํด, ์ฝ์ /์ญ์ ๋น๋ ๋ฐ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ๊ณ ๋ คํ์ญ์์ค.
- ์ ๊ธฐ์ ์ธ ๋ฒค์น๋งํน: ์ด๋ก ์ ๋ถ์์ ๊ฐ์ด๋์ผ ๋ฟ, ์ต์ ํ๋ฅผ ์ํด์๋ ์ค์ ์ธก์ ์ด ํ์์ ์ ๋๋ค.
- ์๋ฐ์คํฌ๋ฆฝํธ ํน์์ฑ ์ธ์ง: ๋ด์ฅ ๋ฉ์๋(์: ๋ฐฐ์ด์ `shift()`)์ ์ฑ๋ฅ ๋์์ค๋ฅผ ์ดํดํ์ญ์์ค.
- ์ฌ์ฉ์ ์ปจํ ์คํธ ๊ณ ๋ ค: ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ ์ธ๊ณ์ ์ผ๋ก ์คํ๋ ๋ค์ํ ํ๊ฒฝ์ ์๊ฐํ์ญ์์ค.
์ํํธ์จ์ด ๊ฐ๋ฐ ์ฌ์ ์ ๊ณ์ํ๋ฉด์, ์๋ฃ ๊ตฌ์กฐ์ ์๊ณ ๋ฆฌ์ฆ์ ๋ํ ๊น์ ์ดํด๊ฐ ์ ์ธ๊ณ ์ฌ์ฉ์๋ฅผ ์ํ ํ์ ์ ์ด๊ณ ์ฑ๋ฅ ์ข์ ์๋ฃจ์ ์ ๋ง๋๋ ๊ฐ๋ ฅํ ๋๊ตฌ์์ ๊ธฐ์ตํ์ญ์์ค.